EC2Launch v2を使ってOpenSSH Server(sshd)のセットアップを行う方法
しばたです。
先日Windows Server 2025がリリースされましたが、Windows Server 2025ではOpenSSH Server(sshd)の機能がインストール済みの状態[1]になっています。
Windows Server組み込みのsshd自体はWindows Server 2019からの新機能ですが、利用の敷居が下がったことでこれから多少は利用が増えるかもしれません。
Windows Server EC2の初期設定を行うEC2Launch v2にもsshdの初期設定を補助する機能があるので本記事ではこの機能について解説しようと思います。
おことわり
EC2Launch v2のenableOpenSshタスク
2020年にリリースされたEC2Launch v2はWindows Server EC2の初期設定を行うツールの最新版であり、Windows Server 2022のAMIから同梱される様になっています。
EC2Launch v2ではWindows Serve EC2の(初回)起動時の様々な初期処理を行っているのですが、この中にsshdのインストールと初期設定を行うenableOpenSsh
タスクがあります。
このタスクでは
- sshdの機能が追加されていない場合は機能の追加を行う
- インスタンスメタデータからEC2キーペアの公開鍵を取得し
administrators_authorized_keys
ファイルに設定する- 加えてファイルに適切なアクセス権を設定
- Windows FirewallにTCP 22番ポートを解放するルール(ルール名
sshd
)を追加
といった処理を自動で行います。
このタスクは「初回起動時」のみ利用可能なため、あらかじめEC2Launch v2の設定ファイルにタスクを仕込むかUserDataに以下の記述を追加することで実行できます。
version: 1.1
tasks:
- task: enableOpenSsh
これだけで諸々の作業を自動化してくれるので非常に便利です。
改良版 UserData
ただ、このenableOpenSsh
タスクは非常に便利なものの、Windows Serverのsshd自体が
- 初期設定ではパスワード認証が有効
- 初期設定では接続先シェルがコマンドプロンプト
であるため、せっかくEC2キーペアを使って鍵認証ができる様になっても片手落ちです。
この点に対してUserDataに次の様にexecuteScript
タスクを追加してやることと改善できます。
version: 1.1
tasks:
- task: enableOpenSsh
- task: executeScript
inputs:
- frequency: once
type: powershell
runAs: admin
content: |
# Update sshd_config
$sshdConfigPath = Join-Path $env:ProgramData 'ssh\sshd_config'
Get-Content $sshdConfigPath -Encoding Ascii -Raw |
ForEach-Object {
$c = $_ -replace '#PubkeyAuthentication', 'PubkeyAuthentication'
$c = $c -replace '#PasswordAuthentication yes', 'PasswordAuthentication no'
$c | Out-File -FilePath $sshdConfigPath -Encoding ascii
}
# Restart service
Restart-Service sshd
# Change default shell
New-ItemProperty -Path 'HKLM:\SOFTWARE\OpenSSH' -Name DefaultShell -Value 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -PropertyType String -Force
enableOpenSsh
タスクの次工程にPowerShellコマンドを実行するexecuteScript
タスクを追記し、
- パスワード認証の無効化と鍵認証の有効化を明示した設定に更新
- その後 sshd サービスを再起動
- 接続先シェルをWindows PowerShellに変更
を行う様にしています。
executeScript
タスクでは実行の周期を選択できるので必ずfrequency: once
にします。
これでLinux EC2と同様にEC2キーペアの秘密鍵をつかった鍵認証のみが有効となります。
補足 : 手作業でsshdの設定を行う
前述の通りenableOpenSsh
タスクは初回起動時のみ実行可能です。
一度起動した後のEC2インスタンスに対してタスクを実行するにはEC2Launchの実行状態をリセットする必要があり、この方法は他のタスクも再実行され副作用が大きいのでお勧めできません。
一度起動した後の既存EC2に対しては手作業でsshdの機能を追加してやるのが現実的です。
Windows Server 2019 ~ Windows Server 2022の場合
Windows Server 2019 ~ Windows Server 2022に対しては以前書いた記事の内容がそのまま使えます。
こちらの記事の内容に従って作業してください。
Windows Server 2025の場合
先日リリースされたWindows Server 2025に対しても前掲の記事の内容が使えるのですが、Windows Server 2025独自の事情として
- sshdの機能が初期インストール済み
- Windows Firewallルール(
OpenSSH SSH Server (sshd)
)のプロファイルがPrivate
のみ- 以前のバージョンだと
All
プロファイルで有効だった
- 以前のバージョンだと
- AMIの初期設定でIMDSv2必須
という初期状態のため少し手順をカスタマイズしてやる必要があります。
1. 機能の有効化
Add-WindowsCapability
コマンドの実行は不要でsshdサービスの起動設定だけ実施します。
# 初期状態で機能が追加済みなので実行不要
# Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# サービスの起動設定だけ行う
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
2. sshd_configの設定変更
従来通りの手順です。
3. 公開鍵設定
基本的にIMDSv2必須になっているのでインスタンスメタデータの取得方法だけ変えてやります。
# IMDSv2に対応した形でインスタンスメタデータを取得し、administrators_authorized_keysファイルに書き込む
$administratorsKeyPath = Join-Path $env:ProgramData 'ssh\administrators_authorized_keys'
$params = @{
Headers = @{
"X-aws-ec2-metadata-token" = Invoke-RestMethod 'http://169.254.169.254/latest/api/token' -Method Put -Headers @{ "X-aws-ec2-metadata-token-ttl-seconds" = 60 }
}
Uri = 'http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key/'
}
Invoke-RestMethod @params | Out-File -FilePath $administratorsKeyPath -Encoding ascii
その他の手順は従来通りです。
4.(Optional) デフォルトシェルの変更
従来通りの手順です。
追加手順 : Windows Firewall設定
次のコマンドでOpenSSH SSH Server (sshd)
ルールを全てのプロファイルで有効にします。
# OpenSSH SSH Server (sshd) ルールのプロファイを更新
Set-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -Enabled 'True' -Profile Any
これでWindows Server 2025環境でも期待通りの動作をさせることができます。
Microsoft公式ドキュメント
一応Microsoft公式ドキュメントも紹介しておきます。
最後に
以上となります。
まだWindows Serverでsshdを使う人は少ないでしょうが誰かの役に立てば幸いです。
初期状態では停止しており、実際に利用するにはサービスの起動が必要 ↩︎